package pers.wensheng.patterns.creator_pattern.singleton_pattern.lazy.impl2;

/**
 *  懒汉式-方式3（双重检查锁），推荐使用这种方式
 */
public class Singleton {
    private Singleton(){}
    //volatile 关键字保证指令是有序的，解决了指令重排序的问题
    private static volatile Singleton instance;

    private static Singleton getInstance(){
        //双重检查锁方式，多线程模式下也实现了单例模式，但是：
        //在多线程的情况下，可能会出现空指针问题，出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。
        //所以还要使用 volatile 关键字
        if (instance == null){
            synchronized (Singleton.class){
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
